<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="nXlC3" id="nXlC3"><span data-lake-id="uc3a62740" id="uc3a62740">典型回答</span></h1>
  <p data-lake-id="ufbcf34f2" id="ufbcf34f2"><br></p>
  <p data-lake-id="u4d8cad8f" id="u4d8cad8f"><span data-lake-id="u74a6038d" id="u74a6038d">经常会有这样的面试题，让你预估一个系统可能得QPS有多少。</span></p>
  <p data-lake-id="u301837d9" id="u301837d9"><span data-lake-id="u69349416" id="u69349416">​</span><br></p>
  <p data-lake-id="u43f034df" id="u43f034df"><br></p>
  <p data-lake-id="u1d8c8084" id="u1d8c8084"><span data-lake-id="ub44ddbf1" id="ub44ddbf1">预估是有必要的， 因为有时候我们一个新的业务要上线，或者要搞一个大促，我们就需要合理的做预估，来预留硬件资源。</span></p>
  <p data-lake-id="u6ece997a" id="u6ece997a"><span data-lake-id="u1d851bf3" id="u1d851bf3">​</span><br></p>
  <p data-lake-id="u1492963b" id="u1492963b"><span data-lake-id="u9c90207b" id="u9c90207b">预估一个系统的QPS通常涉及对业务特性、历史数据、峰值流量和系统架构的综合考虑。以下是一个基本的预估过程。（</span><strong><span data-lake-id="u31178e42" id="u31178e42">我先给一个方法论，然后文末再给个示例</span></strong><span data-lake-id="u7d64b7ae" id="u7d64b7ae">）</span></p>
  <h4 data-lake-id="YZKyB" id="YZKyB"><span data-lake-id="u9e6df2cb" id="u9e6df2cb">分析业务模型</span></h4>
  <ul list="uae2fe773">
   <li fid="u92fc5790" data-lake-id="u846da82e" id="u846da82e" data-lake-index-type="true"><strong><span data-lake-id="u8181f48c" id="u8181f48c">业务类型</span></strong><span data-lake-id="u5800d0e9" id="u5800d0e9">：不同的业务类型的QPS是不太一样的，比如B类业务和C类业务，支付业务和购物车业务，这些都是不太一样的。</span></li>
   <li fid="u92fc5790" data-lake-id="u2b590ade" id="u2b590ade" data-lake-index-type="true"><strong><span data-lake-id="ub403d6cb" id="ub403d6cb">用户基数</span></strong><span data-lake-id="u41f57224" id="u41f57224">：要预付QPS，就要大概知道我们一共有多少用户，人数都不知道，怎么预估出一秒钟有多少人访问呢？所以需要重点考虑目标用户群的规模。</span></li>
   <li fid="u92fc5790" data-lake-id="ud1357bfa" id="ud1357bfa" data-lake-index-type="true"><strong><span data-lake-id="u398b9a3d" id="u398b9a3d">用户行为</span></strong><span data-lake-id="u1abdf908" id="u1abdf908">：分析用户的典型行为模式，如每天的活跃时间、行为频率等。</span></li>
  </ul>
  <h4 data-lake-id="VPjGx" id="VPjGx"><span data-lake-id="u8ccbf021" id="u8ccbf021">参考历史数据</span></h4>
  <ul list="u68947d24">
   <li fid="ub11cdf95" data-lake-id="ud77993c1" id="ud77993c1" data-lake-index-type="true"><span data-lake-id="u695b7e07" id="u695b7e07">如果是已有系统，分析历史流量数据，特别是高峰时段的数据。</span></li>
   <li fid="ub11cdf95" data-lake-id="u58868314" id="u58868314" data-lake-index-type="true"><span data-lake-id="uc98b2eb4" id="uc98b2eb4">对于新系统，可以参考类似系统的公开数据或行业标准。</span></li>
  </ul>
  <h4 data-lake-id="g4oiw" id="g4oiw"><span data-lake-id="u80cb2834" id="u80cb2834">估算日均请求量</span></h4>
  <ul list="u3bcae0c6">
   <li fid="u156a7e5b" data-lake-id="u42d17ede" id="u42d17ede" data-lake-index-type="true"><span data-lake-id="u941b9142" id="u941b9142">根据用户行为和业务模型估算日均请求总量。</span></li>
   <li fid="u156a7e5b" data-lake-id="u2244ee37" id="u2244ee37" data-lake-index-type="true"><span data-lake-id="u08f0f131" id="u08f0f131">例如，如果预计每个用户平均每天产生10次请求，且有10000个活跃用户，则日均请求量为10 * 10000 = 100000次。</span></li>
  </ul>
  <h4 data-lake-id="J3qRJ" id="J3qRJ"><span data-lake-id="u848393d6" id="u848393d6">计算峰值流量</span></h4>
  <ul list="ue05262b6">
   <li fid="u6a6fe4de" data-lake-id="ue66bdfd5" id="ue66bdfd5" data-lake-index-type="true"><span data-lake-id="ud6271f80" id="ud6271f80">峰值流量通常是日均流量的数倍。可以考虑特殊事件（如促销活动）可能带来的流量波动。</span></li>
   <li fid="u6a6fe4de" data-lake-id="u7b7c7ff5" id="u7b7c7ff5" data-lake-index-type="true"><span data-lake-id="u3c477971" id="u3c477971">例如，如果预计峰值流量是日均流量的3倍，则峰值流量为100000 * 3 = 300000次。</span></li>
  </ul>
  <h4 data-lake-id="MIp7G" id="MIp7G"><span data-lake-id="u9d2e4e76" id="u9d2e4e76">估算QPS</span></h4>
  <ul list="u77b35ed9">
   <li fid="ud2b06486" data-lake-id="u1b7d5d60" id="u1b7d5d60" data-lake-index-type="true"><span data-lake-id="u3de61d29" id="u3de61d29">将峰值流量分布到高峰时段。例如，如果高峰时段为2小时，则QPS为 300000 / (2 * 3600) ≈ 42次/秒。</span></li>
   <li fid="ud2b06486" data-lake-id="u399fe28d" id="u399fe28d" data-lake-index-type="true"><span data-lake-id="u1ef89331" id="u1ef89331">考虑系统的容错和冗余设计，通常需要在估算的基础上增加一定的冗余比例。</span></li>
  </ul>
  <h4 data-lake-id="jBpQn" id="jBpQn"><span data-lake-id="u1a284df9" id="u1a284df9">预估增长趋势</span></h4>
  <ul list="uf7048897">
   <li fid="u977fa6bb" data-lake-id="uda43f47f" id="uda43f47f" data-lake-index-type="true"><span data-lake-id="ufa228d9b" id="ufa228d9b">考虑业务增长和用户增长对QPS的影响。</span></li>
   <li fid="u977fa6bb" data-lake-id="u10161f3a" id="u10161f3a" data-lake-index-type="true"><span data-lake-id="u8961e4d4" id="u8961e4d4">预估未来一段时间内的QPS增长趋势，以便进行相应的资源规划。</span></li>
  </ul>
  <h4 data-lake-id="epowE" id="epowE"><span data-lake-id="ub9c4cdf5" id="ub9c4cdf5">考虑架构和技术因素</span></h4>
  <ul list="u9c45f032">
   <li fid="u1cf44f60" data-lake-id="u567d595a" id="u567d595a" data-lake-index-type="true"><span data-lake-id="ue09cb42d" id="ue09cb42d">分布式架构和负载均衡策略可以显著影响系统的处理能力。</span></li>
   <li fid="u1cf44f60" data-lake-id="ud4e11bbb" id="ud4e11bbb" data-lake-index-type="true"><span data-lake-id="ube8fcc09" id="ube8fcc09">缓存、数据库优化和查询优化也会对QPS有重要影响。</span></li>
  </ul>
  <p data-lake-id="u360a3d8f" id="u360a3d8f"><span data-lake-id="u5c12889d" id="u5c12889d">​</span><br></p>
  <h3 data-lake-id="rp0w9" id="rp0w9"><span data-lake-id="u73f3030f" id="u73f3030f">举例</span></h3>
  <p data-lake-id="uc12ac43a" id="uc12ac43a"><br></p>
  <p data-lake-id="u41b3e4ef" id="u41b3e4ef"><span data-lake-id="u00e2c532" id="u00e2c532">根据上面的方法论，我们预估一下微博的互动QPS情况。</span></p>
  <p data-lake-id="u1829c926" id="u1829c926"><br></p>
  <p data-lake-id="u682cbc83" id="u682cbc83"><span data-lake-id="u4fe45baf" id="u4fe45baf">首先，根据公开资料显示，截至2023年，第三季度末，微博月活跃用户达到6.05亿。一般来说，日活用户数是月活用户数的20%-30%左右，按照30%来算的话，那么</span><strong><span data-lake-id="u4f2506ed" id="u4f2506ed">日活用户数为2亿</span></strong><span data-lake-id="u78d74c93" id="u78d74c93">。 </span></p>
  <p data-lake-id="ue82a1acf" id="ue82a1acf"><br></p>
  <p data-lake-id="u3b8e13a3" id="u3b8e13a3"><span data-lake-id="ubae9679e" id="ubae9679e">根据微博这个产品的属性，假设每个用户每天产生2次互动，比如发微博、转发评论等。那么</span><strong><span data-lake-id="ue474b68e" id="ue474b68e">日均请求量就是4亿次</span></strong><span data-lake-id="ub4befec8" id="ub4befec8">（2亿*2）。</span></p>
  <p data-lake-id="u17763e13" id="u17763e13"><span data-lake-id="u44b65ddd" id="u44b65ddd">​</span><br></p>
  <p data-lake-id="uf5c8407c" id="uf5c8407c"><span data-lake-id="u5194878a" id="u5194878a">如果不考虑峰值情况的话，那么把这个4亿次平均分摊一下，那么</span><strong><span data-lake-id="u677bbcfc" id="u677bbcfc">每秒钟就有4639次请求</span></strong><span data-lake-id="u0ef4cbcc" id="u0ef4cbcc">。（4亿/24/3600）</span></p>
  <p data-lake-id="u3fbb7b39" id="u3fbb7b39"><span data-lake-id="u1b557b11" id="u1b557b11">​</span><br></p>
  <p data-lake-id="u2572d63c" id="u2572d63c"><span data-lake-id="uc5b68dba" id="uc5b68dba">但是，一般来说，一个业务的峰值流量会是平时的数倍，在不考虑热点事件的情况下，假设峰值流量是日均流量的3倍，并且每天的峰值流量会维持在2小时左右。那么就有以下公式：</span></p>
  <p data-lake-id="u4667832b" id="u4667832b"><span data-lake-id="u0f65734a" id="u0f65734a">​</span><br></p>
  <p data-lake-id="u8b62e556" id="u8b62e556"><span data-lake-id="ubea87965" id="ubea87965">假设日常流量的QPS为X：</span></p>
  <p data-lake-id="u414ec90a" id="u414ec90a"><span data-lake-id="u28d6dd9b" id="u28d6dd9b">​</span><br></p>
  <p data-lake-id="u6e117e45" id="u6e117e45"><span data-lake-id="ucb22c677" id="ucb22c677">X * （24-2）* 3600 +2 *3 * X * 3600 = 400000000</span></p>
  <p data-lake-id="u94001586" id="u94001586"><span data-lake-id="u3fad75a6" id="u3fad75a6">​</span><br></p>
  <p data-lake-id="ua738a18f" id="ua738a18f"><span data-lake-id="u7c841d61" id="u7c841d61">那么最终可以得出X= 3968。即</span><strong><span data-lake-id="u5386852d" id="u5386852d">日常QPS大概为4000左右，峰值QPS为12000左右。</span></strong></p>
  <p data-lake-id="u825b9276" id="u825b9276"><strong><span data-lake-id="u652eb83f" id="u652eb83f">​</span></strong><br></p>
  <p data-lake-id="u4c099c80" id="u4c099c80"><span data-lake-id="u30825e8f" id="u30825e8f">当然，以上预估我们有很多假设，比如假设日活用户数是月活用户数的30%，假设每个用户每天产生2次互动，假设峰值QPS是日常的3倍，假设峰值时长持续2小时。在我们实际业务做预估的时候，也会有些指标是没有具体值的，也会有假设值。这是很正常的，因为如果所有指标都有具体指，那也就不需要预估了。</span></p>
  <p data-lake-id="u6fe166bb" id="u6fe166bb"><span data-lake-id="ub2cdbd88" id="ub2cdbd88">​</span><br></p>
  <p data-lake-id="uaeebfea1" id="uaeebfea1"><span data-lake-id="u28e02719" id="u28e02719">只不过，假设值越少，预估的结果就越精确。最后，在预估QPS的时候，记得给自己留点buffer。</span></p>
 </body>
</html>